#include <string>

using namespace std;

class HasPtr {
public:
    HasPtr(const string &s = string()) :
        ps(new string(s)), i(0) { }

    // 对 ps 指向的 string,每个 HasPtr 对象都有自己的拷贝
    HasPtr(const HasPtr &p) :
        ps(new string(*p.ps)), i(p.i) { }

    HasPtr& operator =(const HasPtr&);

    ~HasPtr() { delete ps; }
private:
    string *ps;
    int i;
};

// 拷贝赋值运算符
HasPtr& HasPtr::operator =(const HasPtr &rhs)
{
    auto newps = new string(*rhs.ps);   // 拷贝底层 string
    delete ps;      // 释放旧内存
    ps = newps;     // 从右侧运算对象拷贝数据到本对象
    i = rhs.i;
    return *this;   // 返回本对象
}
